package validate

//验证规则
//参考文档：
//https://pkg.go.dev/gopkg.in/go-playground/validator.v10
//https://github.com/go-playground/validator/v10

//https://juejin.cn/post/6847902214279659533
//https://zwzhangyu.blog.csdn.net/article/details/124697592
//https://blog.csdn.net/qq_26273559/article/details/107164846
//https://blog.csdn.net/demon_xi/article/details/119865628
/*

一下列举一部分验证规则，详细验证规则请参考文档：


标记					标记说明									例
required				必填									Field或Struct validate:"required"
omitempty				空时忽略									Field或Struct validate:"omitempty"
len						长度									Field validate:"len=0"
eq						等于									Field validate:"eq=0"
gt						大于									Field validate:"gt=0"
gte						大于等于									Field validate:"gte=0"
lt						小于									Field validate:"lt=0"
lte						小于等于									Field validate:"lte=0"
min						最大值									Field validate:"min=1"
max						最小值									Field validate:"max=2"
required_with			其他字段其中一个不为空且当前字段不为空		Field validate:"required_with=Field1 Field2"
required_with_all		其他所有字段不为空且当前字段不为空			Field validate:"required_with_all=Field1 Field2"
required_without		其他字段其中一个为空且当前字段不为空		Field `validate:“required_without=Field1 Field2”
required_without_all	其他所有字段为空且当前字段不为空			Field validate:"required_without_all=Field1 Field2"
lowercase				符串值是否只包含小写字符					Field validate:"lowercase"
uppercase				符串值是否只包含大写字符					Field validate:"uppercase"
email					字符串值包含一个有效的电子邮件				Field validate:"email"
json					字符串值是否为有效的JSON					Field validate:"json"
url						符串值是否包含有效的 url					Field validate:"url"
uri						符串值是否包含有效的 uri					Field validate:"uri"
base64					字符串值是否包含有效的 base64值			Field validate:"base64"
contains				字符串值包含子字符串值					Field validate:"contains=@"
containsany				字符串值包含子字符串值中的任何字符			Field validate:"containsany=abc"
containsrune			字符串值包含提供的特殊符号值				Field validate:"containsrune=☢"
excludes				字符串值不包含子字符串值					Field validate:"excludes=@"
excludesall				字符串值不包含任何子字符串值				Field validate:"excludesall=abc"
excludesrune			字符串值不包含提供的特殊符号值				Field validate:"containsrune=☢"
startswith				字符串以提供的字符串值开始					Field validate:"startswith=abc"
endswith				字符串以提供的字符串值结束					Field validate:"endswith=abc"
ip						字符串值是否包含有效的 IP 地址				Field validate:"ip"
ipv4					字符串值是否包含有效的 ipv4地址			Field validate:"ipv4"
datetime				字符串值是否包含有效的 日期				Field validate:"datetime"
alpha							Alpha Only													仅字母
alphanum						Alphanumeric												字母 数字
alphanumunicode					Alphanumeric Unicode										字母 数字 Unicode
lowercase						Lowercase													小写字母
numeric							Numeric														数字



--------跨字段验证-----------
如果你想实现让用户输入两次邮箱以保证用户对该邮箱确认无误，后台则需要比较用户输入的两次邮箱是否一致，这个时候跨字段验证就派上用场了。

type User struct {
	Email   	string `form:"email" validate:"required,email"`
	ConfirmedEmail 	string   `form:"confirmedEmail" validate:"required,mail,eqfield=Email"`
}


eqfield					同一结构体字段相等						Field validate:"eqfield=Field2"
nefield					同一结构体字段不相等						Field validate:"nefield=Field2"
gtfield					大于同一结构体字段						Field validate:"gtfield=Field2"
gtefield				大于等于同一结构体字段					Field validate:"gtefield=Field2"
ltfield					小于同一结构体字段						Field validate:"ltfield=Field2"
ltefield				小于等于同一结构体字段					Field validate:"ltefield=Field2"
eqcsfield				跨不同结构体字段相等						Struct1.Field validate:"eqcsfield=Struct2.Field2"
necsfield				跨不同结构体字段不相等					Struct1.Field validate:"necsfield=Struct2.Field2"
gtcsfield				大于跨不同结构体字段						Struct1.Field validate:"gtcsfield=Struct2.Field2"
gtecsfield				大于等于跨不同结构体字段					Struct1.Field validate:"gtecsfield=Struct2.Field2"
ltcsfield				小于跨不同结构体字段						Struct1.Field validate:"ltcsfield=Struct2.Field2"
ltecsfield				小于等于跨不同结构体字段					Struct1.Field validate:"ltecsfield=Struct2.Field2"







-        //忽略字段，告诉验证跳过这个struct字段;这对于忽略嵌入式结构的验证尤其方便。 （用法： - ）
|        //这是'or'运算符，允许使用和接受多个验证器。 （用法：rbg | rgba）< - 这将允许接受rgb或rgba颜色。这也可以与'and'结合使用（例如：用法：omitempty，rgb | rgba）
structonly    //当遇到嵌套结构的字段并包含此标志时，将运行嵌套结构上的任何验证，但不会验证任何嵌套结构字段。如果您在程序内部知道结构有效，但需要验证它是否已分配，这非常有用。注意：结构本身只能使用“required”和“omitempty”。
nostructlevel    //与structonly标记相同，但不会运行任何结构级别验证。
omitempty    //允许条件验证，例如，如果字段未设置值（由“required”验证器确定），则其他验证（如min或max）将不会运行，但如果设置了值，则验证将运行。
dive    //这告诉验证者潜入切片，数组或映射，并使用后面的验证标记验证切片，数组或映射的该级别。还支持多维嵌套，您希望dive的每个级别都需要另一个dive标签。dive有一些子标签，'keys'和'endkeys'，请参阅下面的keys和endkeys部分
－－－－

required    //这将验证该值不是数据类型的默认零值。数字不为０，字符串不为 " ", slices, maps, pointers, interfaces, channels and functions 不为 nil
isdefault    //这验证了该值是默认值，几乎与所需值相反。
len=10    //对于数字，长度将确保该值等于给定的参数。对于字符串，它会检查字符串长度是否与字符数完全相同。对于切片，数组和map，验证元素个数。
max=10    //对于数字，max将确保该值小于或等于给定的参数。对于字符串，它会检查字符串长度是否最多为该字符数。对于切片，数组和map，验证元素个数。
min=10
eq=10    //对于字符串和数字，eq将确保该值等于给定的参数。对于切片，数组和map，验证元素个数。
ne=10    //和eq相反
oneof=red green (oneof=5 7 9)    //对于字符串，整数和uint，oneof将确保该值是参数中的值之一。参数应该是由空格分隔的值列表。值可以是字符串或数字。
gt=10    //对于数字，这将确保该值大于给定的参数。对于字符串，它会检查字符串长度是否大于该字符数。对于切片，数组和map，它会验证元素个数。
gt    //对于time.Time确保时间值大于time.Now.UTC（）
gte=10    //大于等于
gte    //对于time.Time确保时间值大于或等于time.Now.UTC（）
lt=10    //小于
lt    //对于time.Time确保时间值小于time.Now.UTC（）
lte=10    //小于等于
lte    //对于time.Time确保时间值小于等于time.Now.UTC（）
－－－－

unique    //对于数组和切片，unique将确保没有重复项。对于map，unique将确保没有重复值。
alpha    //这将验证字符串值是否仅包含ASCII字母字符
alphanum    //这将验证字符串值是否仅包含ASCII字母数字字符
alphaunicode    //这将验证字符串值是否仅包含unicode字符
alphanumunicode    //这将验证字符串值是否仅包含unicode字母数字字符
numeric    //这将验证字符串值是否包含基本数值。基本排除指数等...对于整数或浮点数，它返回true。
hexadecimal    //这将验证字符串值是否包含有效的十六进制
hexcolor    //这验证字符串值包含有效的十六进制颜色，包括＃标签（＃）
rgb    //这将验证字符串值是否包含有效的rgb颜色
rgba    //这将验证字符串值是否包含有效的rgba颜色
hsl    //这将验证字符串值是否包含有效的hsl颜色
hsla    //这将验证字符串值是否包含有效的hsla颜色
email    //这验证字符串值包含有效的电子邮件这可能不符合任何rfc标准的所有可能性，但任何电子邮件提供商都不接受所有可能性
file    //这将验证字符串值是否包含有效的文件路径，并且该文件存在于计算机上。这是使用os.Stat完成的，它是一个独立于平台的函数。
url    //这会验证字符串值是否包含有效的url这将接受golang请求uri接受的任何url，但必须包含一个模式，例如http：//或rtmp：//
uri    //这验证了字符串值包含有效的uri。这将接受uri接受的golang请求的任何uri
base64    //这将验证字符串值是否包含有效的base64值。虽然空字符串是有效的base64，但这会将空字符串报告为错误，如果您希望接受空字符串作为有效字符，则可以将此字符串与omitempty标记一起使用。
base64url    //这会根据RFC4648规范验证字符串值是否包含有效的base64 URL安全值。尽管空字符串是有效的base64 URL安全值，但这会将空字符串报告为错误，如果您希望接受空字符串作为有效字符，则可以将此字符串与omitempty标记一起使用。
btc_addr    //这将验证字符串值是否包含有效的比特币地址。检查字符串的格式以确保它匹配P2PKH，P2SH三种格式之一并执行校验和验证
btc_addr_bech32    //这验证了字符串值包含bip-0173定义的有效比特币Bech32地址（https://github.com/bitcoin/bips/blob/master/bip-0173.mediawiki）特别感谢Pieter Wuille提供的参考实现。
eth_addr    //这将验证字符串值是否包含有效的以太坊地址。检查字符串的格式以确保它符合标准的以太坊地址格式完全验证被https://github.com/golang/crypto/pull/28阻止
contains=@    //这将验证字符串值是否包含子字符串值
containsany=!@#?    //这将验证字符串值是否包含子字符串值中的任何Unicode code points。
containsrune=@    //这将验证字符串值是否包含提供的符文值。
excludes=@    //这验证字符串值不包含子字符串值。
excludesall=!@#?    //这将验证字符串值在子字符串值中是否包含任何Unicode code points。
excludesrune=@    //这将验证字符串值是否包含提供的符文值。
-----

isbn    //这将验证字符串值是否包含有效的isbn10或isbn13值。
isbn10    //这将验证字符串值是否包含有效的isbn10值。
isbn13    //这将验证字符串值是否包含有效的isbn13值。
uuid    //这将验证字符串值是否包含有效的UUID。
uuid3    //这将验证字符串值是否包含有效的版本3 UUID。
uuid4    //这将验证字符串值是否包含有效的版本4 UUID。
uuid5    //这将验证字符串值是否包含有效的版本5 UUID。
-----

ascii    //这将验证字符串值是否仅包含ASCII字符。注意：如果字符串为空，则验证为true
printascii    //这将验证字符串值是否仅包含可打印的ASCII字符。注意：如果字符串为空，则验证为true。
multibyte    //这将验证字符串值是否包含一个或多个多字节字符。注意：如果字符串为空，则验证为true
datauri    //这将验证字符串值是否包含有效的DataURI。注意：这也将验证数据部分是否有效base64
latitude    //这将验证字符串值是否包含有效的纬度。
longitude    //这将验证字符串值是否包含有效经度。
ssn    //这将验证字符串值是否包含有效的美国社会安全号码。
ip    //这将验证字符串值是否包含有效的IP地址
ipv4    //这将验证字符串值是否包含有效的v4 IP地址
ipv6    //这将验证字符串值是否包含有效的v6 IP地址
cidr    //这将验证字符串值是否包含有效的CIDR地址
cidrv4    //这将验证字符串值是否包含有效的v4 CIDR地址
cidrv5    //这将验证字符串值是否包含有效的v5 CIDR地址
tcp_addr    //这将验证字符串值是否包含有效的可解析TCP地址
tcp4_addr    //这将验证字符串值是否包含有效的可解析v4 TCP地址
tcp6_addr    //这将验证字符串值是否包含有效的可解析v6 TCP地址
udp_addr    //这将验证字符串值是否包含有效的可解析UDP地址
udp4_addr    //这将验证字符串值是否包含有效的可解析v4 UDP地址
udp6_addr    //这将验证字符串值是否包含有效的可解析v6 UDP地址
ip_addr    //这将验证字符串值是否包含有效的可解析IP地址
ip4_addr    //这将验证字符串值是否包含有效的可解析v4 IP地址
ip6_addr    //这将验证字符串值是否包含有效的可解析v6 IP地址
unix_addr    //这将验证字符串值是否包含有效的Unix地址







------Fields:------
Tag								Description													ch

eqcsfield						Field Equals Another Field (relative)						字段等于另一个字段（相对）
eqfield							Field Equals Another Field									字段等于另一个字段
fieldcontains					NOT DOCUMENTED IN doc.go									未记录在doc.go中
fieldexcludes					NOT DOCUMENTED IN doc.go									未记录在doc.go中
gtcsfield						Field Greater Than Another Relative Field					字段大于另一个相对字段
gtecsfield						Field Greater Than or Equal To Another Relative Field		字段大于或等于另一个相对字段
gtefield						Field Greater Than or Equal To Another Field				字段大于或等于另一个字段
gtfield							Field Greater Than Another Field							大于另一个字段的字段
ltcsfield						Less Than Another Relative Field							小于另一个相对字段
ltecsfield						Less Than or Equal To Another Relative Field				小于或等于另一个相对字段
ltefield						Less Than or Equal To Another Field							小于或等于另一个字段
ltfield							Less Than Another Field										小于另一个字段
necsfield						Field Does Not Equal Another Field (relative)				字段不等于另一个字段（相对）
nefield							Field Does Not Equal Another Field							字段不等于另一个字段

------Network:------
Tag								Description

cidr							Classless Inter-Domain Routing CIDR							无类别域际路由选择CIDR
cidrv4							Classless Inter-Domain Routing CIDRv4						无类别域际路由选择CIDRv4
cidrv6							Classless Inter-Domain Routing CIDRv6						无类别域际路由选择CIDRv6
datauri							Data URL													数据URL
fqdn							Full Qualified Domain Name (FQDN)							完全限定域名（FQDN）
hostname						Hostname RFC 952											主机名RFC 952
hostname_port					HostPort													主机端口
hostname_rfc1123				Hostname RFC 1123
ip								Internet Protocol Address IP								因特网协议地址IP
ip4_addr						Internet Protocol Address IPv4								因特网协议地址IPv4
ip6_addr						Internet Protocol Address IPv6								因特网协议地址IPv6
ip_addr							Internet Protocol Address IP
ipv4							Internet Protocol Address IPv4
ipv6							Internet Protocol Address IPv6
mac								Media Access Control Address MAC							mac地址
tcp4_addr						Transmission Control Protocol Address TCPv4					tcp地址
tcp6_addr						Transmission Control Protocol Address TCPv6
tcp_addr						Transmission Control Protocol Address TCP
udp4_addr						User Datagram Protocol Address UDPv4						udp地址
udp6_addr						User Datagram Protocol Address UDPv6
udp_addr						User Datagram Protocol Address UDP
unix_addr						Unix domain socket end point Address						Unix域套接字端点地址
uri								URI String													URI字符串
url								URL String													URl字符串
url_encoded						URL Encoded													URL编码
urn_rfc2141						Urn RFC 2141 String											Urn RFC 2141字符串

------Strings:------
Tag								Description

alpha							Alpha Only													仅字母
alphanum						Alphanumeric												字母 数字
alphanumunicode					Alphanumeric Unicode										字母 数字 Unicode
alphaunicode					Alpha Unicode												字母 Unicode
ascii							ASCII														ASCII
boolean							Boolean														布尔值
contains						Contains													含
containsany						Contains Any
containsrune					Contains Rune
endsnotwith						Ends Not With
endswith						Ends With
excludes						Excludes
excludesall						Excludes All
excludesrune					Excludes Rune
lowercase						Lowercase													小写字母
multibyte						Multi-Byte Characters										多字节字符
number							NOT DOCUMENTED IN doc.go
numeric							Numeric														数字
printascii						Printable ASCII												可打印的ASCII
startsnotwith					Starts Not With												！开头
startswith						Starts With													开头
uppercase						Uppercase													大写字母

------Format 格式化:------
Tag								Description

base64							Base64 String
base64url						Base64URL String
bic								Business Identifier Code (ISO 9362)							企业识别码（ISO 9362）
bcp47_language_tag				Language tag (BCP 47)										语言标签（BCP 47）
btc_addr						Bitcoin Address												比特币地址
btc_addr_bech32					Bitcoin Bech32 Address (segwit)
credit_card						Credit Card Number											信用卡号码
datetime						Datetime													日期时间
e164							e164 formatted phone number									e164格式化电话号码
email							E-mail String												邮箱
eth_addr						Ethereum Address											以太坊地址
hexadecimal						Hexadecimal String											十六进制串
hexcolor						Hexcolor String
hsl								HSL String
hsla							HSLA String
html							HTML Tags													html标签
html_encoded					HTML Encoded												html编码
isbn							International Standard Book Number							国际标准书号
isbn10							International Standard Book Number 10
isbn13							International Standard Book Number 13
iso3166_1_alpha2				Two-letter country code (ISO 3166-1 alpha-2)				双字母国家代码（ISO 3166-1 alpha-2）
iso3166_1_alpha3				Three-letter country code (ISO 3166-1 alpha-3)
iso3166_1_alpha_numeric			Numeric country code (ISO 3166-1 numeric)					数字国家代码（ISO 3166-1数字）
iso3166_2						Country subdivision code (ISO 3166-2)
iso4217							Currency code (ISO 4217)
json							JSON														json
jwt								JSON Web Token (JWT)										JSON Web令牌 jwt
latitude						Latitude													纬度
longitude						Longitude													经度
postcode_iso3166_alpha2			Postcode													邮政编码
postcode_iso3166_alpha2_field	Postcode													邮政编码
rgb								RGB String													RGB字符串
rgba							RGBA String
ssn								Social Security Number SSN									社会保障号码SSN
timezone						Timezone													时区
uuid							Universally Unique Identifier UUID							通用唯一标识符UUID
uuid3							Universally Unique Identifier UUID v3
uuid3_rfc4122					Universally Unique Identifier UUID v3 RFC4122
uuid4							Universally Unique Identifier UUID v4
uuid4_rfc4122					Universally Unique Identifier UUID v4 RFC4122
uuid5							Universally Unique Identifier UUID v5
uuid5_rfc4122					Universally Unique Identifier UUID v5 RFC4122
uuid_rfc4122					Universally Unique Identifier UUID RFC4122
md4								MD4 hash													md4
md5								MD5 hash													md5
sha256							SHA256 hash													sha256
sha384							SHA384 hash													SHA384
sha512							SHA512 hash													SHA512
ripemd128						RIPEMD-128 hash
ripemd128						RIPEMD-160 hash
tiger128						TIGER128 hash
tiger160						TIGER160 hash
tiger192						TIGER192 hash
semver							Semantic Versioning 2.0.0
ulid							Universally Unique Lexicographically Sortable Identifier ULID


------Comparisons 比较:------
Tag								Description

eq								Equals														等于
gt								Greater than												大于
gte								Greater than or equal										大于等于
lt								Less Than													小于
lte								Less Than or Equal											小于等于
ne								Not Equal													不等

------Other 其它:------
Tag								Description

dir								Directory													文件夹
file							File path													文件路径
isdefault						Is Default													默认
len								Length														长度
max								Maximum														最大限度
min								Minimum														最小限度
oneof							One Of														...之一
required						Required													必填
required_if						Required If													如果
required_unless					Required Unless												除非
required_with					Required With												要求
required_with_all				Required With All											全部必需
required_without				Required Without											无需
required_without_all			Required Without All										不需要全部
excluded_if						Excluded If													排除在外，如果
excluded_unless					Excluded Unless
excluded_with					Excluded With
excluded_with_all				Excluded With All
excluded_without				Excluded Without
excluded_without_all			Excluded Without All
unique							Unique														唯一的

------Aliases 别名:------
Tag								Description

iscolor							hexcolor|rgb|rgba|hsl|hsla
country_code					iso3166_1_alpha2|iso3166_1_alpha3|iso3166_1_alpha_numeric











*/
